package com.zm.campus.interceptor;

import com.zm.campus.exceptions.GlobalException;
import com.zm.campus.pojo.RespBeanEnum;
import com.zm.campus.util.AssertUtil;
import com.zm.campus.util.CookieUtil;
import com.zm.campus.util.GetHeadersInfo;
import com.zm.campus.vo.LoginReturnVo;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

/*非法拦截访问
      继承HandlerInterceptorAdapter适配器,并重写具体的方法
      拦截器要生效需要一个配置类来配置相关要拦截的资源和不用拦截的资源
* */
public class NoLoginInterceptor extends HandlerInterceptorAdapter {
    @Autowired
    private RedisTemplate redisTemplate;

    //在执行目标方法（目标资源）之前要执行的方法，返回false代表不放行要执行的方法，返回true代表目标方法可被执行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        if (request.getMethod().equals("OPTIONS")) {//由于我向请求头中添加了自定义的属性，所以发送请求时就属于非简单请求。
//            return true;
//        }
        /*前端在请求头的Authorization加了token，每次访问都会携带这个token信息，这里是访问控制器之前会来到的过滤
        如果用户未登录访问，则会抛未登录异常。当然访问那些被过滤掉的资源除外，如登录、注册、静态资源等
        从请求头中中获取token(Authorization: "529584071769198592")*/
        Map headers = GetHeadersInfo.getHeaders(request);
        String token = (String) headers.get("authorization");
        String cacheToken="user:"+token;//将前端的token和redis缓存中的token对比
        LoginReturnVo loginReturnVo =(LoginReturnVo) redisTemplate.opsForValue().get("user:" + token);

        //说明当前的token是空、缓存服务器数据过期或者从未登录记录到，未登录
        AssertUtil.isTrue(StringUtils.isBlank(token)||loginReturnVo==null||!cacheToken.equals("user:"+loginReturnVo.getToken()),RespBeanEnum.NoLogin);
        return true;
    }
}
